#include "FileUploaderProcess.h"

FileUploaderProcess::FileUploaderProcess(LogFile* logFile) : Process(logFile) {
}

void FileUploaderProcess::setRequest(SharedRecord request) {
	this->request = request;
}

void FileUploaderProcess::setRequestReceptorFifoName(string requestReceptorFifoName) {
	this->requestReceptorFifoName = requestReceptorFifoName;
}

int FileUploaderProcess::doWork() {
	SharedFile file;
	SharedRecord record;
	bool found = false;

	logFile->log("[" + this->getProcessName() + "] Bloqueando archivo compartido para lectura.");
	file.getReadLock();

	logFile->log("[" + this->getProcessName() + "] Recorriendo archivo compartido.");
	while (!file.isEOF() && !found) {
		logFile->log("[" + this->getProcessName() + "] Obteniendo proximo registro.");
		record = file.getNextRecord();
		string fifoPath = record.requestFifo;
		string filePath = record.sharedFilePath;

		found = (fifoPath == this->requestReceptorFifoName) && (filePath == this->request.sharedFilePath);
	}

	logFile->log("[" + this->getProcessName() + "] Desbloqueando archivo compartido.");
	file.unlock();

	this->logFile->log("[" + this->getProcessName() + "] Creando fifo " + this->request.requestFifo + " para transferir el archivo " + this->request.sharedFilePath + ".");
	FileTransferFifo fifo(this->request.requestFifo);

	if (found) {
		this->logFile->log("[" + this->getProcessName() + "] Abriendo archivo a transferir: " + this->request.sharedFilePath);

		string filePath = this->request.sharedFilePath;
		DownloadedFile file(filePath);
		file.getReadLock();

		this->logFile->log("[" + this->getProcessName() + "] Transmitiendo archivo: " + this->request.sharedFilePath);
		char chunk[TRANSFERFILEBUFFERSIZE];

		int readBytes = file.readData(chunk, TRANSFERFILEBUFFERSIZE);
		while (readBytes > 0) {
			fifo.writeData(chunk, readBytes);
			readBytes = file.readData(chunk, TRANSFERFILEBUFFERSIZE);
		}

		this->logFile->log("[" + this->getProcessName() + "] Transmision finalizada. Cerrando archivo: " + this->request.sharedFilePath);

		file.unlock();
	} else {
		this->logFile->log("[" + this->getProcessName() + "] El archivo pedido no se encuentra compartido: " + this->request.sharedFilePath);
		char* msg = (char*)"Error: El archivo pedido no se encuentra compartido.";
		fifo.writeData(msg, strlen(msg));
	}

	return 0;
}

string FileUploaderProcess::getProcessName() {
	return string("FileUploader");
}

FileUploaderProcess::~FileUploaderProcess() {
}
